package com.chatTools.protocol;

import com.chatTools.message.LoginRequestMessage;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.channel.embedded.EmbeddedChannel;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;

/**
 * @author： pang-yun
 * @date： 2021-09-16 13:58
 * 功能目的 ：用于 使用embeddedfChannel
 *  LengthFieldBasedFrameDecoder  帧解码器
 */
/*
*  netty 中的 handler 是否可以 多次使用
*   netty 中在 类上有 标记的  @Sharable 就是线程安全的  可以全局共用一个
* */



public class TestDemo {
    public static void main(String[] args) throws Exception {
        EmbeddedChannel channel = new EmbeddedChannel(
                // 为防止 出现半包现象    加 LengthFieldBasedFrameDecoder
                new LoggingHandler(LogLevel.INFO),
                new LengthFieldBasedFrameDecoder(1024,12,4,0,0),
                new MessageCodec());

        // encode  方法
        LoginRequestMessage message = new LoginRequestMessage("pang", "1234");
        channel.writeOutbound(message);

        // decode  方法
        ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer();
        // 将 message  消息 编码写入到 bytebuf 中
        new MessageCodec().encode(null, message, byteBuf);

        // 入站   读取 用户传入 bytebuf的结果  即解码
        //channel.writeInbound(byteBuf);
        // 测试下一个时  要将 这句注掉  bytebuf 处理后会释放内存  导致下一个出现异常

        //------------------使用 buf.slice 将bytebuf 模拟半包现象---- 如果没有使用 帧解码器  就会报错
        ByteBuf s1 = byteBuf.slice(0,100);
        ByteBuf s2 = byteBuf.slice(100,byteBuf.readableBytes()-100);

        s1.retain();  // 引用计数加 1  防止 第一次 writeInbound 后将 内存释放   因为 s1 s2 bytebuf 用的是同一个内存 会释放全部 导致第二次 inbound 错误
        channel.writeInbound(s1);
        channel.writeInbound(s2);



    }
}
